package com.woniuxy.yoga.commons.core.util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class IdCardUtil {



    public static boolean checkIdCard1(String idCard){
        //身份证的正则表达式
        String reg = "[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx]";
        //不符合格式
        if (idCard==null||!idCard.matches(reg)) return false;
        //将字母转为大字
        idCard = idCard.toUpperCase();
        //身份证的加权因子乘数
        int[] multiples = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        //保存乘数总和
        int sum = 0;
        //循环前17位身份证号乘以加权因子数
        for (int i = 0; i < 17; i++) {
            sum+=(idCard.charAt(i)-'0')*multiples[i];
        }
        //余数校验码
        char[] checkCode = {'1','0','X','9','8','7','6','5','4','3','2'};
        //总和除以11的余数对应效验码下标
        int i = sum % 11;
        return checkCode[i] == idCard.charAt(idCard.length()-1);
    }

    public static boolean checkIdCard2(String idCard){
        //身份证的正则表达式
        String reg = "[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx]";
        //不符合格式
        if (idCard==null||!idCard.matches(reg)) return false;
        //将字母转为大字
        idCard = idCard.toUpperCase();
        //将idCard分割为数组
        String[] idCards = idCard.split("");
        //身份证的加权因子乘数
        int[] multiples = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        //保存乘数总和
        int sum = 0;
        //循环前17位身份证号乘以加权因子数
        for (int i = 0; i < idCards.length-1; i++) {
            sum+=Integer.parseInt(idCards[i])*multiples[i];
        }
        //余数校验码
        char[] checkCode = {'1','0','X','9','8','7','6','5','4','3','2'};
        //总和除以11的余数对应效验码下标
        int i = sum % 11;
        return idCards[idCards.length-1].equals(String.valueOf(checkCode[i]));
    }

    public static Integer idCardToAge1(String idCard){
        //身份证的正则表达式
        String reg = "[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx]";
        //不符合格式
        if (!idCard.matches(reg)) return null;
        //截取年份
        String s1 = idCard.substring(6, 10);
        //截取月日
        String s2 = idCard.substring(10, 14);
        //获取当天日期
        String newDate = new SimpleDateFormat("yyyy.MMdd").format(new Date());
        //当天日期减去出生日期
        return (int)(Double.parseDouble(newDate)-Double.parseDouble(s1+"."+s2));
    }


    public static Integer idCardToAge2(String idCard){
        //身份证的正则表达式
        String reg = "[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx]";
        //不符合格式
        if (idCard==null||!idCard.matches(reg)) return null;
        //截取用户的年份
        String s1 = idCard.substring(6, 10);
        //截取用户的月日
        String s2 = idCard.substring(10, 14);
        //过去当天的年，月日数据
        String[] newDate = new SimpleDateFormat("yyyy-MMdd").format(new Date()).split("-");
        //算出年龄
        int age = Integer.parseInt(newDate[0])-Integer.parseInt(s1);
        //不符合要求的年份
        if (age==0||age<0) age=1;
        //当天的月日小于用户的出生月日，应减一岁
        if (newDate[1].compareTo(s2) < 0) age--;

        return age;
    }


    public static String idCardToGender(String idCard){
        //身份证的正则表达式
        String reg = "[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[\\dXx]";
        //不符合格式
        if (idCard==null||!idCard.matches(reg)) return null;
        //截取第17位，奇数为男，偶数为女
        return (idCard.charAt(16)-'0') % 2 ==0?"女":"男";
    }
}
